Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вопрос о include/require (MeisterKhan)
Author Message
MeisterKhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sun Oct 16, 2005 6:32 am (написано за 5 минут 8 секунд)
   Post subject: Вопрос о include/require
Reply with quote

Господа, есть проблема.
Хочу написать функцию, которой нужно указывать имя файла, что бы она его потом загрузила и можно было работать с данными этого файла, но у меня не получаетца.
Пример:
Скажем, есть файл index.php и есть языковый файл errors.phр. Например в Index.php делаетца обработка какой-то ошибки, и в случае этой ошибки должно вываливатся сообщение из errors.php. Примерно таким макаром:
Code (php): скопировать код в буфер обмена
require_once('load.php'); // loadLanguage

function some_error() {
....
loadLanguage('errors');
echo (www.php.net/echo) "$txt['db_error']";
....
}
По поводу "неполучается".
Пхп выдает Notice, мол, undefined index 'db_error' - для примера.

Подскажите как можно сделать это дело, и если можно - то готовый код. Пасиба.
Back to top
Programmer
Участник форума



Joined: 23 Sep 2005
Posts: 43
Карма: 2
   поощрить/наказать


PostPosted: Sun Oct 16, 2005 8:23 am (спустя 1 час 50 минут; написано за 9 секунд)
   Post subject:
Reply with quote

Quote:
 мол, undefined index 'db_error' - для примера.
в массиве нет элемента db_error.

а насчет функции, то можно применить следущий пример:
Code (php): скопировать код в буфер обмена
class get_file
{
        function get_files($file)
        {
                if(is_array (www.php.net/is_array)($file)){
                    foreach($file as $key => $value){
                        if(file_exists (www.php.net/file_exists)($value)){
                                return dirname (www.php.net/dirname)(__FILE__) . '\\' . $value;
                            } else {
                        return false;
                }
                }
            } else {
                return dirname (www.php.net/dirname)(__FILE__) . '\\'$file;
        }
        }
}

try {
        $file_array = array (www.php.net/array)(
        'index.php'
        );
        $get_file = new get_file($file_array);
        $files = $get_file->get_files($file_array);
        if($files == false)
                throw new Exception();
        else
                print (www.php.net/print)($files);
}
catch(Exception $e) {
        print (www.php.net/print)('<br /><b>Special error</b>: Can not load file');
}
только при возвращении результата в функции используйте конструкцию return require_once(...);
Back to top
View user's profile Send private message
MeisterKhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Oct 17, 2005 8:14 am (спустя 23 часа 51 минуту; написано за 28 секунд)
   Post subject:
Reply with quote

А можно пример немножко по проще и по удобнее? :)) что бы просто - "loadLanguage('errors')" и все дела. :)
Back to top
MeisterKhan
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Oct 17, 2005 10:52 am (спустя 2 часа 37 минут; написано за 16 секунд)
   Post subject:
Reply with quote

P.S. Пример неработает.
Back to top
Алексей С.
Участник форума



Joined: 11 Nov 2004
Posts: 103
Карма: 1
   поощрить/наказать


PostPosted: Thu Oct 20, 2005 1:48 am (спустя 2 дня 14 часов 56 минут; написано за 14 секунд)
   Post subject:
Reply with quote

код функции loadLanguage('errors') в студию
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Thu Oct 20, 2005 6:39 pm (спустя 16 часов 51 минуту; написано за 3 минуты 38 секунд)
   Post subject:
Reply with quote

Вот - errors.php
Code (php): скопировать код в буфер обмена
<?php
  $txt=array (www.php.net/array)('db_errors'=>'Yea!!');
  function txts($s) {
     global (www.php.net/global) $txt;
     return $txt[$s] ;
  }
  function txt2($s) {
     return 'error # '.$s ;
  }
?>
/ а вот собственно тест
Code (php): скопировать код в буфер обмена
<?php
   function FindFile($s) {
      return $s.'.php' ;
   }
   function loadLanguage($s) {
      require_once (FindFile($s));
   }
/*************************************************/
//   require_once(FindFile('errors')); // так - работает!
   loadLanguage('errors'); // так - не работает!
   echo (www.php.net/echo) $txt['db_errors']." ".txts('db_errors')." ".txt2('db_errors');
?>
Поймал себя на мысли, что иногда в языке не хватает С-шных define'оф :)))
Интересно, что, во втором случае, если в errors.php описаны функции, то они будут исправно видны снаружи, Зато переменные полностью пропадают... Причуды области видимости переменных, однако!!!

Last edited by Ksnk on Fri Oct 21, 2005 2:36 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Алексей С.
Участник форума



Joined: 11 Nov 2004
Posts: 103
Карма: 1
   поощрить/наказать


PostPosted: Fri Oct 21, 2005 1:16 pm (спустя 18 часов 36 минут; написано за 2 минуты 14 секунд)
   Post subject:
Reply with quote

ужас.
я не понимаю всего этого огорода с функциями.
что мешает:
если уж так хочется в errors.php просто писать массив $txt
и подключать этот файл.

а потом к нему ображаться echo $txt['db_errors']?
зачем все эти FindFile,LoadLanguage,txts?

Зато переменные полностью пропадают... бред. так не бывает
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Oct 21, 2005 3:05 pm (спустя 1 час 49 минут; написано за 2 минуты 17 секунд)
   Post subject:
Reply with quote

Поправил ранее опубликованый пример для повышения его самочевидности ;)
Вывод этого примера представляет собой
Quote:
Notice: Undefined variable: txt in q:\site\public_html\test\req.php on line 11
[Денвер: показать возможную причину ошибки] error # db_errors
Back to top
View user's profile Send private message Send e-mail
Алексей С.
Участник форума



Joined: 11 Nov 2004
Posts: 103
Карма: 1
   поощрить/наказать


PostPosted: Fri Oct 21, 2005 4:46 pm (спустя 1 час 41 минуту; написано за 59 секунд)
   Post subject:
Reply with quote

не могу сейчас проверить.
без сервака сижу.
незнаю. загоните эту txt в массив GLOBALS , или передайте в функция параметром.
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Oct 21, 2005 4:53 pm (спустя 7 минут; написано за 1 минуту 44 секунды)
   Post subject:
Reply with quote

Алексей С.
В этом примере иллюстрируется поведение PHP при include'е, выполненном в теле процедуры... И не более того.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Mon Oct 24, 2005 1:09 am (спустя 2 дня 8 часов 16 минут; написано за 22 секунды)
   Post subject:
Reply with quote

А если в эту ФайндФайл функцию добавить global $txt; ?
Back to top
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Mon Oct 24, 2005 4:42 pm (спустя 15 часов 32 минуты; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

Anonymous wrote:
А если в эту ФайндФайл функцию добавить global $txt; ?
И что? Полагаете должно помочь? У меня - не помогло :( В том смысле, что сообщение об ошибке Денвером теперь не выдается, а значение переменной $txt теперь пусто.
Back to top
View user's profile Send private message Send e-mail
Programmer
Участник форума



Joined: 23 Sep 2005
Posts: 43
Карма: 2
   поощрить/наказать


PostPosted: Sat Oct 29, 2005 7:49 pm (спустя 5 дней 3 часа 6 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

loadLanguage - процедура. и подгрузка файла идет в процедуру. выходом из положения будет вариант
function FindFile($s) {
      return $s.'.php' ;
   }
   function loadLanguage($s) {
      return require_once (FindFile($s));
   }
Back to top
View user's profile Send private message
Programmer
Участник форума



Joined: 23 Sep 2005
Posts: 43
Карма: 2
   поощрить/наказать


PostPosted: Sat Oct 29, 2005 7:51 pm (спустя 2 минуты; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

а по поводу того, что мой пример "не работает" - это скорее всего из-за вашей версии php. мой пример для php5
тем более мой пример позволяет подгружать сразу несколько файлов. ваш лишь один. к тому же - зачем эта путаница с вашими функциями?
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Mon Oct 31, 2005 3:53 pm (спустя 1 день 20 часов 2 минуты; написано за 4 минуты 40 секунд)
   Post subject:
Reply with quote

Возможно, что дело действительно в верcии PHP. У меня - штатная версия от Денвера - PHP Version 4.3.10. В ней includ'ы внутри тела процедуры обрабатываются тем "экзотическим" способом, который я попытался описать. Возможно это поправлено в 5-й версии, у меня проверить пока нет возможности :(.
С другой стороны, с позиции общей идеологии языка - include - это просто вставка текста из другого файла и с этих позиций, описания переменных внутри тела процедуры там и должны были потеряться, как кстати и описания новых функций.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Oct 31, 2005 7:31 pm (спустя 3 часа 37 минут; написано за 44 секунды)
   Post subject:
Reply with quote

Нет, функции в PHP всегда создаются глобальными. А переменные - конечно же, локальны. Если хотите сделать их глобальными во включаемом файле, используйте либо $GLOBALS, либо инструкцию global. Так было во всех версиях PHP и, вероятно, так и останется.
Back to top
View user's profile Send private message Send e-mail
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Mon Oct 31, 2005 7:47 pm (спустя 15 минут; написано за 2 минуты 46 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Да! Действительно, не причуды, а совсем даже RTFM :)
если в первой строчке моего errors.php написать $GLOBALS["txt"]=array('db_errors'=>'Yea!!');, то все исправно работает.
2 MeisterKhan
 Помогло?
Back to top
View user's profile Send private message Send e-mail
2ko
Участник форума



Joined: 07 Mar 2005
Posts: 28
Карма: 1
   поощрить/наказать

Location: Гомель / Беларусь

PostPosted: Wed Nov 02, 2005 11:17 am (спустя 1 день 15 часов 30 минут; написано за 3 минуты 55 секунд)
   Post subject:
Reply with quote

1. пример, то что приводился для php5
2. сделать require или include из-под функции нельзя.
Quote:
Because this is a language construct and not a function, it cannot be called using variable functions
3. выход - только грузить в Globals
Code (php): скопировать код в буфер обмена
function LoadError($file=null,$req) {
        if(is_readable (www.php.net/is_readable)($file)) {
                require($file);
                $GLOBALS['loaded_errors'] = eval (www.php.net/eval)("\$".$req); // $errors находится в файле $file. $errors = array('001'=>'error 00000001 :)');
        } else {
                return false;
        }
}
ну, или просто return $errors; //если знаем что ищем
Back to top
View user's profile Send private message
amikhailov
Участник форума



Joined: 11 Nov 2004
Posts: 180
Карма: 5
   поощрить/наказать

Location: Екатеринбург

PostPosted: Tue Nov 29, 2005 8:31 am (спустя 26 дней 21 час 13 минут; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

2ko wrote:
сделать require или include из-под функции нельзя
допустим нам надо инклюдить файл с именем file.php
делаем так (у меня все работает: PHP5):
Code (php): скопировать код в буфер обмена
function loadfile() {
  eval (www.php.net/eval)("require('file.php');");
}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML